// exports.ElementAllocator = void 0;
// var AL_GAME_HUA_ElementConfig = require("./AL_GAME_HUA_ElementConfig");
// var r = (function () {
//     function e(e) {
//         var t = this;
//         this.icons = [];
//         this.iconsMap = [];
//         this.iconsLenght = 0;
//         this.canUseLength = 0;
//         var n = this.huoqu_yuansu_leixing_liebiao(e.icons, e.type, e.count);
//         this.icons = n;
//         var o = [];
//         n.forEach(function (e) {
//             o.push([e, e, e]);
//             t.iconsLenght += 3;
//         });
//         this.canUseLength = this.iconsLenght;
//         this.iconsMap = o;
//         this.waitMap = {};
//         this.protectList = [];
//     }
//     e.prototype.tianjia_tubiao = function (e) {
//         var t = this.icons.indexOf(e);
//         if (-1 != t) {
//             if (!this.iconsMap[t]) {
//                 this.iconsMap[t] = [];
//             }
//             this.iconsMap[t].push(e);
//             this.iconsLenght++;
//         }
//     };
//     e.prototype.tanchu_tubiao = function (e) {
//         var t = e.pop();
//         this.iconsLenght--;
//         this.canUseLength--;
//         return t;
//     };
//     e.prototype.tianjia_dao_dengdai_duilie = function (e, t) {
//         if (!this.waitMap[e]) {
//             this.waitMap[e] = [];
//         }
//         var n = this.icons.indexOf(t);
//         if (-1 != n) {
//             this.iconsMap[n].remove(t);
//             this.canUseLength--;
//             this.waitMap[e].push(t);
//             this.protectList.push(n);
//         }
//     };
//     e.prototype.dengdai_duilie_zhong_suoyou_tubiao_fanhui_yingshe = function (e) {
//         var t = this;
//         var n = this.waitMap[e];
//         if (n) {
//             n.forEach(function (e) {
//                 var n = t.icons.indexOf(e);
//                 if (-1 != n) {
//                     if (!t.iconsMap[n]) {
//                         t.iconsMap[n] = [];
//                     }
//                     t.iconsMap[n].push(e);
//                     t.canUseLength++;
//                 }
//             });
//             delete this.waitMap[e];
//         }
//     };
//     e.prototype.dengdai_duilie_zhong_suoyou_tubiao_fanhui = function () {
//         for (var e in this.waitMap) this.dengdai_duilie_zhong_suoyou_tubiao_fanhui_yingshe(parseInt(e));
//     };
//     e.prototype.chazhao_dange = function () {
//         var e = [];
//         for (var t = 0; t < arguments.length; t++) {
//             e[t] = arguments[t];
//         }
//         if (this.canUseLength < 1) {
//             this.dengdai_duilie_zhong_suoyou_tubiao_fanhui();
//         }
//         var n = this.iconsMap;
//         for (var o = 0; o < n.length; o++) {
//             if (0 != (i = n[o]).length && !(i.length > 0 && e.indexOf(i[0]) >= 0) && i.length > 0) {
//                 return this.tanchu_tubiao(i);
//             }
//         }
//         for (o = 0; o < n.length; o++) {
//             var i;
//             if (0 != (i = n[o]).length && i.length > 0) {
//                 return this.tanchu_tubiao(i);
//             }
//         }
//         return null;
//     };
//     e.prototype.chazhao_liangge = function () {
//         if (this.canUseLength < 2) {
//             this.dengdai_duilie_zhong_suoyou_tubiao_fanhui();
//         }
//         var e = this.iconsMap;
//         var t = null;
//         for (var n = 0; n < e.length; n++) {
//             var o = e[n];
//             if (0 != o.length) {
//                 if (o.length >= 2) {
//                     var i = [];
//                     for (var r = 0; r < 2; r++) {
//                         i.push(this.tanchu_tubiao(o));
//                     }
//                     return i;
//                 }
//                 if (!(1 != o.length || t)) {
//                     t = o;
//                 }
//             }
//         }
//         return t ? [this.tanchu_tubiao(t)] : [];
//     };
//     e.prototype.bianli_icon_liist_map = function (e) {
//         var t = this.iconsMap;
//         for (var n = 0; n < t.length; n++) {
//             var o = t[n];
//             if (0 != o.length) {
//                 var i = !1;
//                 if (e.iconsCallback) {
//                     i = e.iconsCallback(o, n);
//                 }
//                 if (i) {
//                     break;
//                 }
//                 for (var r = 0; r < o.length; r++) {
//                     var a = !1;
//                     if (e.iconCallback) {
//                         a = e.iconCallback(o[r], n, r);
//                     }
//                     if (a) {
//                         break;
//                     }
//                 }
//             }
//         }
//     };
//     e.prototype.huoqu_yuansu_leixing_liebiao = function (e, t, n) {
//         t = Math.min(t, e.length);
//         var r = [];
//         for (var a = 0; a < e.length; a++) {
//             var s = AL_GAME_HUA_ElementConfig.ElementConfig.getInstance().huoqu_tubiao_qita(e[a]);
//             if (!r[s]) {
//                 r[s] = [];
//             }
//             r[s].push(e[a]);
//         }
//         var c = [];
//         for (a = 0; a < r.length; a++) {
//             if (r[a]) {
//                 c = __spreadArrays(c, Array.daluanShuzuShunxu(r[a]));
//             }
//         }
//         var l = c.slice();
//         var u = n / 3;
//         var p = [];
//         for (a = 0; a < u; a++) {
//             p.push(l[a % l.length]);
//         }
//         return p;
//     };
//     return e;
// })();
// exports.ElementAllocator = r;


exports.ElementAllocator = void 0;
const ElementConfig = require("./AL_GAME_HUA_ElementConfig");

class ElementAllocator {

    constructor(config) {
        this.icons = []; // 存储元素图标
        this.iconsMap = []; // 图标分组映射
        this.iconsLenght = 0; // 当前图标总数（包括重复）
        this.canUseLength = 0; // 可用的图标总数（未加入等待队列）
        const elementTypeList = this.huoqu_yuansu_leixing_liebiao(config.icons, config.type, config.count);
        this.icons = elementTypeList;
        this.iconsMap = elementTypeList.map(icon => Array(3).fill(icon)); // 每个图标三倍填充
        this.iconsLenght = this.iconsMap.length * 3;
        this.canUseLength = this.iconsLenght;
        this.waitMap = {}; // 等待队列
        this.protectList = []; // 保护列表
    }

    /**
     * 添加图标到图标映射中和增加总长度
     * @param icon - 要添加的图标
     */
    tianjia_tubiao(icon) {
        const index = this.icons.indexOf(icon);
        if (index !== -1) {
            if (!this.iconsMap[index]) {
                this.iconsMap[index] = [];
            }
            this.iconsMap[index].push(icon);
            this.iconsLenght++;
        }
    }

    /**
     * 从图标数组中弹出一个图标并更新长度
     * @param iconsList - 图标数组
     * @returns {*} 弹出的图标
     */
    tanchu_tubiao(iconsList) {
        const icon = iconsList.pop();
        this.iconsLenght--;
        this.canUseLength--;
        return icon;
    }

    /**
     * 将图标添加到等待队列中
     * @param waitKey - 等待队列Key
     * @param icon - 要添加的图标
     */
    tianjia_dao_dengdai_duilie(waitKey, icon) {
        if (!this.waitMap[waitKey]) {
            this.waitMap[waitKey] = [];
        }
        const index = this.icons.indexOf(icon);
        if (index !== -1) {
            this.iconsMap[index].remove(icon);
            this.canUseLength--;
            this.waitMap[waitKey].push(icon);
            this.protectList.push(index);
        }
    }

    /**
     * 将等待队列中的所有图标返回到图标映射中
     * @param waitKey - 等待队列Key
     */
    dengdai_duilie_zhong_suoyou_tubiao_fanhui_yingshe(waitKey) {
        const iconsList = this.waitMap[waitKey];
        if (iconsList) {
            iconsList.forEach(icon => {
                const index = this.icons.indexOf(icon);
                if (index !== -1) {
                    if (!this.iconsMap[index]) {
                        this.iconsMap[index] = [];
                    }
                    this.iconsMap[index].push(icon);
                    this.canUseLength++;
                }
            });
            delete this.waitMap[waitKey];
        }
    }

    /**
     * 将所有等待中的图标返回到图标映射中
     */
    dengdai_duilie_zhong_suoyou_tubiao_fanhui() {
        for (const waitKey in this.waitMap) {
            this.dengdai_duilie_zhong_suoyou_tubiao_fanhui_yingshe(parseInt(waitKey));
        }
    }

    /**
     * 查找一个可用的单图标，返回未占用的图标
     */
    // chazhao_dange(...excludedIcons) {
    //     if (this.canUseLength < 1) {
    //         this.dengdai_duilie_zhong_suoyou_tubiao_fanhui();
    //     }
    //     for (const iconsList of this.iconsMap) {
    //         if (iconsList.length > 0 && !excludedIcons.includes(iconsList[0])) {
    //             return this.tanchu_tubiao(iconsList);
    //         }
    //     }
    //     return null;
    // }

    chazhao_dange() {
        var e = [];
        for (var t = 0; t < arguments.length; t++) {
            e[t] = arguments[t];
        }
        if (this.canUseLength < 1) {
            this.dengdai_duilie_zhong_suoyou_tubiao_fanhui();
        }
        var n = this.iconsMap;
        for (var o = 0; o < n.length; o++) {
            if (0 != (i = n[o]).length && !(i.length > 0 && e.indexOf(i[0]) >= 0) && i.length > 0) {
                return this.tanchu_tubiao(i);
            }
        }
        for (o = 0; o < n.length; o++) {
            var i;
            if (0 != (i = n[o]).length && i.length > 0) {
                return this.tanchu_tubiao(i);
            }
        }
        return null;
    }

    /**
     * 查找两个可用的双图标，返回两个相同的图标
     */
    chazhao_liangge() {
        if (this.canUseLength < 2) {
            this.dengdai_duilie_zhong_suoyou_tubiao_fanhui();
        }

        let singleList = null;
        for (const iconsList of this.iconsMap) {
            if (iconsList.length >= 2) {
                return [this.tanchu_tubiao(iconsList), this.tanchu_tubiao(iconsList)];
            }
            if (iconsList.length === 1 && !singleList) {
                singleList = iconsList;
            }
        }
        return singleList ? [this.tanchu_tubiao(singleList)] : [];
    }

    /**
     * 遍历iconsMap并对每个元素执行指定的回调函数
     * @param callbacks - 包含回调函数的对象
     */
    bianli_icon_liist_map(callbacks) {
        this.iconsMap.forEach((iconsList, index) => {
            if (iconsList.length > 0) {
                let shouldBreak = false;
                if (callbacks.iconsCallback) {
                    shouldBreak = callbacks.iconsCallback(iconsList, index);
                }
                if (shouldBreak) return;

                iconsList.forEach((icon, iconIndex) => {
                    if (callbacks.iconCallback) {
                        shouldBreak = callbacks.iconCallback(icon, index, iconIndex);
                    }
                    if (shouldBreak) return;
                });
            }
        });
    }

    /**
     * 获取元素的类型列表
     * @param iconArray - 图标数组
     * @param type - 类型
     * @param count - 数量
     * @returns {*} 排序后的图标数组
     */
    huoqu_yuansu_leixing_liebiao(iconArray, type, count) {
        if (type < 0 || type > iconArray.length) {
            throw new Error('图标类型输入错误');
        }

        const typeMap = iconArray.reduce((acc, icon) => {
            const order = ElementConfig.ElementConfig.getInstance().huoqu_tubiao_qita(icon);
            if (!acc[order]) {
                acc[order] = [];
            }
            acc[order].push(icon);
            return acc;
        }, {});

        let combinedList = [];
        for (const order in typeMap) {
            combinedList = [...combinedList, ...Array.daluanShuzuShunxu(typeMap[order])];
        }

        const repeatCount = Math.ceil(count / 3);
        return Array.from({length: repeatCount}, (_, i) => combinedList[i % combinedList.length]);
    }
}

exports.ElementAllocator = ElementAllocator;